package concurrent.thread.volatile_1;

import java.util.concurrent.TimeUnit;

/**
 * volatile 修饰的关键字，是为了增加 主线程和线程之间的可见性，只要有一个线程修改了内存中的值，其它线程也能马上感知
 */
public class VolatileTest {

	public static void main(String[] args) {
		//资源类
		MyData myData = new MyData();

		new Thread(() -> {
			System.out.println(Thread.currentThread().getName() + "\n come in");

			try {
				TimeUnit.SECONDS.sleep(3);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}

			// 修改number的值
			myData.addTo60();

			// 输出修改后的值
			System.out.println(Thread.currentThread().getName() + "\t update number value:" + myData.number);


		}, "AAA").start();

		// main线程就一直在这里等待循环，直到number的值不等于零
		while (myData.number == 0) {
		}

		// 按道理这个值是不可能打印出来的，因为主线程运行的时候，number的值为0，所以一直在循环
		// 如果能输出这句话，说明AAA线程在睡眠3秒后，更新的number的值，重新写入到主内存，并被main线程感知到了
		System.out.println(Thread.currentThread().getName() + "\t mission is over");
	}

}

class MyData {

	volatile int number = 0;

	public void addTo60() {
		this.number = 60;
	}
}
